package com.summer.bilibili.model;

import com.summer.bilibili.util.MathUtils;
import com.summer.bilibili.util.PageImpl;
import lombok.Data;
import org.springframework.data.domain.PageRequest;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 处理分页查询参数，并构建分页对象
 */
@Data
public class SearchParams implements Serializable {
    /**
     * 分页页码
     */
    @NotNull
    @Min(value = 1)
    private int pageNum = 1;
    /**
     * 每页条数 (禁止同时使用pageSize和selectCollection)
     * 有时会让pageSize为0，目的是查total
     */
    @NotNull
    @Min(value = 0)
    private int pageSize = 10;
    /**
     * 是否先查找总数,否则page的total属性为null
     */
    @NotNull
    private boolean searchCount = true;

    /**
     * 基础分页对象（空记录）
     *
     * @param <R>
     * @return
     */
    public < R > PageImpl < R > page () {
        return new PageImpl < R > ( pageNum , pageSize , searchCount );
    }

    /**
     * 带泛型类型的分页对象
     *
     * @param resultType
     * @param <R>
     * @return
     */
    public < R > PageImpl < R > page ( Class < R > resultType ) {
        return new PageImpl < R > ( pageNum , pageSize , searchCount );
    }

    /**
     * 仅设置总数的分页对象（空记录）
     *
     * @param total
     * @param <R>
     * @return
     */
    public < R > PageImpl < R > page ( Number total ) {
        return page ( Collections.emptyList ( ) , total );
    }

    /**
     * 完整分页对象（记录+总数）
     *
     * @param records
     * @param total
     * @param <R>
     * @return
     */
    public < R > PageImpl < R > page ( List < R > records , Number total ) {
        PageImpl < R > page = new PageImpl <> ( pageNum , pageSize , searchCount );
        page.setRecords ( records ); // 设置数据列表
        page.setTotal ( total.intValue ( ) ); // 设置总记录数
        return page;
    }

    /**
     * Spring data适配器
     *
     * @return
     */
    public PageRequest pageRequest () {
        if ( pageSize == 0 ) {
            return PageRequest.of ( pageNum - 1 , 1 ); // 最小化查询
        }
        //PageRequest的size不能为0
        return PageRequest.of ( pageNum - 1 , // Spring data 页码从 0 开始
                MathUtils.clamp ( pageSize , 1 , 100 ) ); // 限制1 - 100条
    }
}
